package repl

import (
	"fmt"
	"os"
	"parse/src/interpreter"
	"parse/src/lexer"
	"parse/src/parser"
)

/**
开始程序
out 输出的
color 颜色
*/
func Start(input string, contextObj *interpreter.Context, interpreterObj *interpreter.Interpreter) (*interpreter.RTResult, *interpreter.Error) {

	/** 产生 tokens **/
	lexerObj := lexer.New("控制台输入", input)
	tokens_, err := lexerObj.MakeTokens()
	if err != nil {
		return nil, err
	}
	/** 产生 ast 语法树 **/
	parserObj := parser.New(tokens_)
	ast := parserObj.Parse()
	if ast.Error_ != nil {
		return nil, ast.Error_
	}
	/** 运行程序 **/
	// 开始运行总节点，这里是运行所有节点的入口函数，（一个程序会被解析成为一个节点，
	// 这个节点里面会有很多的子节点，就是通过分析这个节点以及其子节点实现运行程序的）
	result := interpreterObj.Visit(ast.Node, contextObj)
	return result, nil
}

// 做一些程序的初始化
func Init() {
	// 得到当前的文件夹的根路径
	wd, err := os.Getwd()
	if err != nil {
		// 有错误就退出
		fmt.Println(err.Error())
		os.Exit(1)
	}
	fmt.Println(wd)
}
